package uy.edu.ort.negocio;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.html.simpleparser.HTMLWorker;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import uy.edu.ort.dominio.Pagina;
import uy.edu.ort.dominio.Programa;
import uy.edu.ort.excepciones.PdfException;

/**
 *
 * @author 153287-154559
 */
public class GeneradorDirectorios {

    /**
     * Ruta de la carpeta Documentos local.
     */
    private static final String userDocumentsFolder = System.getProperty("user.home") + "\\Documents"; 
    
    /**
     * Carpeta donde crear los programas.
     */
    private static final String programFolder = "\\ProgramasWeb";
    
    /**
     * Genera el directorio fisico con el nombre del programa
     * @param programa 
     */
    public static void generarDirectorio(Programa programa) {
        File directorioBase = new File(userDocumentsFolder + programFolder);
        if (!directorioBase.exists()) {
            System.out.println("creating directory: ProgramasWeb");
            boolean result = directorioBase.mkdir();
            if (result) {
                System.out.println("DIR ProgramasWeb created");
            }
        }
        File directorio = new File(userDocumentsFolder + programFolder + "\\" + programa.getNombre());

        // if the directory does not exist, create it
        if (!directorio.exists()) {
            System.out.println("creating directory: " + programa.getNombre());
            boolean result = directorio.mkdir();
            if (result) {
                System.out.println("DIR created");
            }
        }
    }

    /**
     * Genera la pagina real del programa junto con su pdf.
     * @param programa
     * @throws IOException 
     */
    public static void generarArchivosPrograma(Programa programa) throws IOException {
        for (Pagina pagina : programa.getPaginas()) {
            String directorio = userDocumentsFolder + programFolder + "\\" + programa.getNombre();
            File f = new File(directorio + "\\" + pagina.getNombre() + ".html");
            BufferedWriter bw = new BufferedWriter(new FileWriter(f));
            bw.write(pagina.getHtmlData());
            bw.close();

            f.createNewFile();
            System.out.println("Página " + pagina.getNombre() + " creada en "
                    + userDocumentsFolder + programFolder  + "\\" + programa.getNombre());
            try {
                convertirAPdf(pagina, directorio);
            } catch (PdfException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }

    /**
     * Genera pdf a partir de un html.
     * @param pagina
     * @param directorio
     * @throws PdfException 
     */
    private static void convertirAPdf(Pagina pagina, String directorio) throws PdfException {
        try {
            Document document = new com.itextpdf.text.Document(PageSize.A4);
            PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(directorio + "\\" + pagina.getNombre() + ".pdf"));
            document.open();
            document.addAuthor("Pelados");
            document.addCreator("Pelados");
            document.addSubject("Subject");
            document.addCreationDate();
            document.addTitle(pagina.getNombre());
            HTMLWorker htmlWorker = new HTMLWorker(document);
            htmlWorker.parse(new StringReader(pagina.getHtmlData()));
            document.close();
        } catch (DocumentException ex) {
            throw new PdfException(ex.getCause(), ex.getMessage());
        } catch (IOException ex) {
            throw new PdfException(ex.getCause(), ex.getMessage());
        } 

    }
}
